package dominio;


/**
 * Aquesta classe conté el tauler i les operacions relacionades.
 */

public class Tauler{

	private Casella[][] tauler;
	private int comptador,mida;
	private CtrlPartida ctrlPartida;
	private CtrlJoc ctrlJoc;
	
	public Tauler() {
		this.ctrlPartida = new CtrlPartida();
		this.comptador = 0;
		this.mida = this.ctrlPartida.getMida();
	}
	
	/*
	 * Configura el tauler amb un tauler buit
	 * @param mida
	 * @param tauler en String(?)
	 */
	public void creaTaulerNet(int mida){
		this.tauler = new Casella[mida][mida];
		int i,j; 
		for(i=0; i<mida; i++){
			for(j=0; j<mida; j++){
				this.tauler[i][j] = new Casella();
			}    		
		}
		
	}
	
	/*
	 * Configura el tauler amb un tauler ja donat
	 * @param mida
	 * @param tauler en int[][]
	 * @return si el tauler te les posicions correctes
	 */
	public boolean creaTaulerPle(int mida, int[][] tau) {
		int i,j;
		this.tauler = new Casella[mida][mida];
		this.comptador = tau.length;
		
		for(i=0; i<mida; i++){
			for(j=0; j<mida; j++){
				this.tauler[i][j].setValor(tau[i][j]);
				//ho faig aixi perque segurament les caselles tindran mes info
			}    		
		}
		return this.comprovarTauler(this.tauler);
	}
	
	 
	public Casella[][] getTauler() {
		return this.tauler;
	}

	/*
	 * @return retorna comptador de fitxes posades
	 */
	public int retornaComptador() {
		return this.comptador;
	}

	public void actualitzaComptador(int comptador) {
		this.comptador = comptador;
	}

	public void setTauler(Casella[][] t) {
		this.tauler = t;
	}
	
	/*
	 * La funcio actualitzar una posicio del tauler.
	 * @param jugador
	 * @param posicio x
	 * @param posicio y
	 * @return retorna si la posicio esta lliure
	 */
	public boolean actualitzarTauler(int jug, int x, int y) {

		if (errorPosicions(x,y)) return false;

		int c = this.tauler[x][y].getValor();
		if(c != 0) return false;
		
		this.tauler[x][y].setValor(c);
		this.comptador++;
		return true;
	}
	
	public boolean estaOcupada(int x, int y){
		if (errorPosicions(x,y)) return false;
		return (this.tauler[x][y].getValor() != 0);
	}

	public boolean comprovarTauler(Casella[][] tau) {

		int i,j,valor,comp1,comp2;
		int maxim = ctrlPartida.getMida();
		int primer = ctrlJoc.getTornjug();
		comp1 = comp2 = 0;
		
		for(i=0; i<maxim; i++){
			for(j=0; j<maxim; j++){
				valor = this.tauler[i][j].getValor();
				if(valor == 1) comp1++;
				else if(valor == 2) comp2++;
			} 
		}
		if(comp1 == comp2) return true;
		
		if(primer == 1) {
			if(comp1 == comp2 + 1) return true;
			return false;
		}else{
			if(comp2 == comp1 + 1) return true;
			return false;
		}
	}

	/*
	 * La funcio retorna un string amb el comptador i els valors de les posicions del tauler
	 * @return string amb comptador i valors de les posicions del tauler separats per comes
	 */
	public String getInfoTauler(){
		int i,j;
		String tau = Integer.toString(comptador);
		int mida = ctrlPartida.getMida();
		
		for(i=0; i<mida; i++){
			for(j=0; j<mida; j++){
				tau += ','+Integer.toString(this.tauler[i][j].getValor());
			}
		}
		
		return tau;
	}
	
	
	private boolean errorPosicions(int x, int y){
		int mida = ctrlPartida.getMida();
		return (x < 0 || x >= mida || y < 0 || y >= mida);
	}

	public void actualitzarMida(int mida) {
		this.mida = mida;
	}
	
}
